//定义类型
// class Person {


//   constructor(
//       public name: string,
//       public age: number
//     ) {
//   }


//   speak() {
//     console.log(`我是  ${this.name}  今年 ${this.age}`);

//   }

// }














class Person {
    // name和age是受保护属性，不能在类外部访问，但可以在【类】与【⼦类】中访问
    constructor(
        protected name: string,
        protected age: number,
         // IDCard属性为私有的(private)属性，只能在【类内部】使⽤
        private IDCard: string
    ) {}
    
    // getDetails是受保护⽅法，不能在类外部访问，但可以在【类】与【⼦类】中访问
    protected getDetails(): string {
        // 类中能访问受保护的name和age属性
        return `我叫：${this.name}，年龄是：${this.age} IDCard: ${this.IDCard}` 
    }
    
    // introduce是公开⽅法，类、⼦类、类外部都能使⽤
    introduce() {
        // 类中能访问受保护的getDetails⽅法
        console.log(this.getDetails()); 
    } 
}


const p1 = new Person('杨超越',18,"2222220015484")
// 可以在类外部访问introduce


p1.introduce()
// 以下代码均报错
// p1.getDetails()
// p1.name
// p1.age





class Student extends Person {
    constructor(name:string,age:number){
           super(name,age,"") 
    }
    study(){
      // this.getDetails()
        // ⼦类中可以访问introduce
        this.introduce()
        // ⼦类中可以访问name
        // this.

        console.log(`${this.name}正在努⼒学习`) 
    } 
}


const s1 = new Student('tom',17)
s1.introduce()










class Car {
    constructor(
        public readonly vin: string, //⻋辆识别码，为只读属性
        public readonly year: number,//出⼚年份，为只读属性
        public color: string,
        public sound: string
    ) { }
    // 打印⻋辆信息
    displayInfo() {
        console.log(` 识别码：${this.vin}, 出⼚年份：${this.year}, 颜⾊：${this.color}, ⾳响：${this.sound} `); 
    } 
}

const car = new Car('1HGCM82633A123456', 2018, '⿊⾊', 'Bose⾳响');
car.displayInfo()

// 以下代码均错误：不能修改 readonly 属性
// car.vin = '897WYE87HA8SGDD8SDGHF'; 
// car.year = 2020;